#include "list.h"

// 学生登录
bool Student_log_in(list_str *L, int *index)
{
    system("clear");
    printf("------------欢迎来到学生登录界面-----------\n");

    // 声明两个字符串
    char user[128];
    char pass[128];
    bool flag_user = false;//账号名标志
    bool flag_pass = false;//密码标志

    int chance = 3;//三次机会
    while (chance)
    {
        // 清空字符串
        memset(user, 0, sizeof(user));
        memset(pass, 0, sizeof(pass));
        // 用户输入
        printf("请输入你的账号名:");
        scanf(" %s", user);
        printf("请输入密码:");
        scanf(" %s", pass);
        // 循环判定
        for (size_t i = 0; i < L->len; i++)
        {
            if (!strcmp(user, L->date[i].user_name))
            {
                flag_user = true; // 账号正确

                if (!strcmp(pass, L->date[i].password))
                {
                    flag_pass = true; // 密码正确
                    *index = i;
                }
            }
        }
        // 判断账号与密码是否都正确
        if (flag_user == true && flag_pass == true)
        {
            return true;
        }
        else
        {
            chance--;
            printf("登录失败,你还有%d次机会\n", chance);
        }
    }
    return false;
}

// 老师登录
bool Teacher_log_in(list_str *L)
{
    system("clear");
    printf("------------欢迎来到老师登录界面-----------\n");

    // 声明两个字符串
    char user[128];
    char pass[128];
    bool flag_user = false;
    bool flag_pass = false;
    int chance = 3;
    while (chance)
    {
        // 清空字符串
        memset(user, 0, sizeof(user));
        memset(pass, 0, sizeof(pass));
        // 用户输入
        printf("请输入账号");
        scanf("%s", user);
        printf("请输入密码");
        scanf("%s", pass);
        // 循环判定
        for (size_t i = 0; i < L->len; i++)
        {
            if (!strcmp(user, L->date[i].user_name))
            {
                flag_user = true; // 账号正确

                if (!strcmp(pass, L->date[i].password))
                {
                    flag_pass = true; // 密码正确
                }
            }
        }
        // 判断账号与密码是否都正确
        if (flag_user == true && flag_pass == true)
        {
             return true;
        }
        else
        {
            chance--;
            printf("登录失败,你还有%d次机会\n", chance);
        }
    }
    return false;
}

//初始化信息表
void list_init(list_str **L)
{
    // 创建动态内存
    (*L) = (list_str *)malloc(sizeof(list_str));
    if (NULL == (*L))
    {
        printf("创建失败\n");
        exit(-1);
    }
    // 初始化数据
    (*L)->len = 0;
    return;
}

//添加数据到信息表
bool list_add(list_str *L, stu_user data)
{
    // 判定是否为空
    if (NULL == L)
    {
        printf("传入顺序表为空\n");
        exit(-1);
    }

    // 是否越界
    if (MAX_LEN <= L->len)
    {
        printf("学生已经满了\n");
        return false;
    }

    // 插入操作
    L->date[L->len] = data;

    // 迭代长度
    L->len++;
}

// 删除学生
bool list_del(list_str *L)
{
    // 判定是否为空
    if (NULL == L)
    {
        printf("传入顺序表为空\n");
        exit(-1);
    }
    // 是否没有学生了
    if (-1 >= L->len)
    {
        printf("全开除了\n");
        return false;
    }
    // 删除尾部学生
    L->len--;
}
// 老师改学生信息
bool list_Teacher_alter(list_str *L)
{
    int num = 0;
    int index = 0;
    system("clear");//清屏
    printf("1、姓名\n");
    printf("2、性别\n");
    printf("3、学号\n");
    printf("4、年龄\n");
    printf("5、成绩\n");

    printf("请输入你要更改的信息编号(1~5): ");
    scanf("%d", &num);
    index = list_Teacher_find(L);
    if (index == -1)
    {
        printf("你要修改的信息不存在\n");
        exit(-1);
    }
    switch (num)
    {
    case 1:
    {
        /* 更改姓名 */
        printf("姓名更改为:");
        scanf("%s", L->date[index].name);
        break;
    }
    case 2:
    {
        /* 更改性别 */
        printf("性别更改为:");
        scanf("%s", L->date[index].sex);
        break;
    }
    case 3:
    { 
        /* 更改id */
        printf("学号更改为:");
        scanf("%d", &L->date[index].id);
        break;
    }
    case 4:
    {
        /* 更改年龄 */
        printf("年龄更改为:");
        scanf("%d", &L->date[index].age);
        break;
    }
    case 5:
    {
        /* 更改成绩 */
        printf("成绩更改为:");
        scanf("%d", &L->date[index].sco);
        break;
    }
    default:
        break;
    }
}

// 老师查：老师可以查所以信息
int list_Teacher_find(list_str *L)
{
    int num = 0;
    //判断是否为空
    if (NULL == L)
    {
        printf("表为空\n");
        exit(-1);
    }
    printf("1、姓名\n");
    printf("2、性别\n");
    printf("3、学号\n");
    printf("4、年龄\n");
    printf("5、成绩\n");
    printf("请输入你要查询信息的编号(1~5):  ");
    scanf("%d", &num);
    switch (num)
    {
    case 1:
    {
        /* 根据性名查 */
        char name_user[128];
        printf("请输入你要查询的姓名:");
        scanf("%s", name_user);
        for (int i = 0; i < L->len; i++)
        {
            if (!strcmp(name_user, L->date[i].name))
                return i;
        }
        return -1;
        break;
    }
    case 2:
    {
        /* 根据性别查 */
        char sex_user[128];
        printf("请输入你要查询的性别:");
        scanf("%s", sex_user);
        for (int i = 0; i < L->len; i++)
        {
            if (!strcmp(sex_user, L->date[i].sex))
                return i;
        }
        return -1;
        break;
    }
    case 3:
    {
        /* 根据学号查 */
        int id_user;
        printf("请输入你要查询的学号:");
        scanf("%d", &id_user);
        for (int i = 0; i < L->len; i++)
        {
            if (id_user == L->date[i].id)
                return i;
        }
        return -1;
        break;
    }
    case 4:
    {
        /* 根据年龄查 */
        int age_user;
        printf("请输入你要查询的年龄:");
        scanf("%d", &age_user);
        for (int i = 0; i < L->len; i++)
        {
            if (age_user == L->date[i].age)
               {
                return i;
               } 
        }
        return -1;
        break;
    }
    case 5:
    {
        /* 根据成绩查 */
        int sco_user;
        printf("请输入你要查询的成绩:");
        scanf("%d", &sco_user);
        for (int i = 0; i < L->len; i++)
        {
            if (sco_user == L->date[i].sco)
               return i;
        }
        return -1;
        break;
    }
    default:
        break;
    }
}
// 学生查：只能查自己
int list_Student_find(list_str *L, stu_user data)
{
    char name_user[128];
    strcpy(name_user, data.name);
    for (size_t i = 0; i < L->len; i++)
    {
        if (!strcmp(name_user, L->date[i].name))
        {
            system("clear");
            printf(" ---------------------------------查询成功-------------------------------\n");
            printf("姓名:%-8s\t性别:%-8s\t学号:%-8d\t年龄%-8d\t成绩:%-8d\n",
                   L->date[i].name, L->date[i].sex, L->date[i].id, L->date[i].age, L->date[i].sco);
            return 1;
        }
    }
    return 0;
}

// 成绩排序：冒泡排序
void list_sort(list_str *L)
{
    stu_user temp;
    for (size_t i = 0; i < L->len - 1; i++)
    {
        for (size_t j = 1; j < L->len - i; j++)
        {
            if (L->date[j].sco < L->date[j - 1].sco) // 升序
            {
                temp = L->date[j];
                L->date[j] = L->date[j - 1];
                L->date[j - 1] = temp;
            }
        }
    }
}

// 遍历程序
void list_printf(list_str *L)
{
    if (NULL == L)
    {
        printf("传入顺序表为空\n");
        exit(-1);
    }

    for (size_t i = 0; i < L->len; i++)
    {
        printf("%s\t%s\t%s\t%s\t%d\t%d\t%d\n",
               L->date[i].user_name, L->date[i].password,
               L->date[i].name, L->date[i].sex, L->date[i].id,
               L->date[i].age, L->date[i].sco);
    }
}

// 释放顺序表
void list_free(list_str **L)
{
    if (L == NULL || *L == NULL)
        return;
    free(*L);  // 直接释放结构体
    *L = NULL; // 置空外部指针
}

// 九九乘法表
void table()
{
    system("clear");
    printf("--------------------------------------------------------------九九乘法表------------------------------------------------------------------\n");
    for (size_t i = 1; i < 10; i++)
    {
        for (size_t j = 1; j <= i; j++)
        {
            printf("%ld * %ld = %ld\t", j, i, i * j);
        }
        printf("\n");
    }
    return;
}

// 猜数字
void guess()
{
    system("clear");
    srand(time(NULL));
    unsigned int val = rand() % 100; // rand() % 100 会生成 0 到 99 的随机数
    int temp = 0;
    int min_temp = 0;
    int max_temp = 99;
    while (1)
    {
        printf("请输入你要猜的数:");
        scanf("%d", &temp);

        // 比随机值大
        if (temp > val) // val 是 随机值
        {
            if (temp > max_temp) // 违规
            {
                printf("违规状态 请输入%d~%d\n", min_temp, max_temp);
            }
            else
            {
                // 刷新
                max_temp = temp;
                printf("数据大了:%d~%d\n", min_temp, max_temp);
            }
        }

        // 比随机值小
        if (temp < val)
        {
            if (temp < min_temp)
            {
                printf("违规状态 请输入 %d~%d\n", min_temp, max_temp);
            }
            else
            {
                // 刷新
                min_temp = temp;
                printf("数据小了: %d~%d\n", min_temp, max_temp);
            }
        }

        // 等于随机数
        if (temp == val)
        {
            printf("恭喜你,猜中了!!!\n");
            return;
        }
    }
    return;
}

// 计算器
void calculator()
{
    float a, c;
    char b;
    system("clear");
    printf("请输入你的算式\n");
    scanf("%f %c %f", &a, &b, &c);
    switch (b)
    {
    case '+':
        printf("%.3f + %.3f = %.3f\n", a, c, a + c);
        break;
    case '-':
        printf("%.3f - %.3f = %.3f\n", a, c, a - c);
        break;
    case '*':
        printf("%.3f * %.3f = %.3f\n", a, c, a * c);
        break;
    case '/':
        printf("%.3f / %.3f = %.3f\n", a, c, a / c);
        break;
    default:
        break;
    }
}